#include "types.h"
#include "riscv.h"
#include "proc.h"
#include "defs.h"

// 创建子进程（实验可先返回-1，后续完善）
int sys_fork(void) {
  // TODO: 实现fork逻辑
  return -1;
}

// 终止当前进程
int sys_exit(void) {
  exit_process(0); // 0为退出码
  return 0; // 不会执行到这里
}

// 等待子进程
int sys_wait(void) {
  int status = 0;
  return wait_process(&status);
}

// 发送信号（杀死进程）
int sys_kill(void) {
  int pid;
  if (argint(0, &pid) < 0)
    return -1;
  
  struct proc *p;
  for (p = proc; p < &proc[NPROC]; p++) {
    acquire(&p->lock);
    if (p->pid == pid) {
      p->killed = 1;
      if (p->state == SLEEPING) {
        // 唤醒进程，让它能够检查killed标志
        p->state = RUNNABLE;
      }
      release(&p->lock);
      return 0;
    }
    release(&p->lock);
  }
  return -1;
}

// 获取当前进程ID
int sys_getpid(void) {
  struct proc *p = myproc();
  return p ? p->pid : -1;
}

// 堆空间调整（简化实现：返回0表示成功）
int sys_sbrk(void) {
  int n;
  if (argint(0, &n) < 0)
    return -1;
  // 简化实现：内核线程模型下不需要堆管理
  // 返回0表示成功
  return 0;
}